from app.utils.mongo import db
from datetime import datetime
from bson.objectid import ObjectId

class User:
    """用户模型，处理用户数据的CRUD操作"""
    # 关联MongoDB中的users集合
    collection = db.users

    @classmethod
    def get_by_openid(cls, openid: str):
        """通过openid查询用户"""
        return cls.collection.find_one({"openid": openid})

    @classmethod
    def create_or_update(cls, openid: str, user_info: dict = None):
        """创建或更新用户（微信登录后同步信息）"""
        # 基础数据（必传）
        user_data = {
            "openid": openid,
            "updated_at": datetime.now()
        }
        # 如果有用户信息（昵称、头像等），补充数据
        if user_info:
            user_data.update({
                "nickname": user_info.get("nickName"),
                "avatar_url": user_info.get("avatarUrl"),
                "gender": user_info.get("gender"),
                "country": user_info.get("country"),
                "province": user_info.get("province"),
                "city": user_info.get("city")
            })
        
        # 存在则更新，不存在则插入（原子操作）
        result = cls.collection.update_one(
            {"openid": openid},  # 查询条件
            {"$set": user_data},  # 更新内容
            upsert=True  # 不存在则插入
        )
        # 返回用户ID（新插入的ID或已存在的ID）
        return result.upserted_id or cls.get_by_openid(openid)["_id"]

    @classmethod
    def get_by_id(cls, user_id: str):
        """通过ID查询用户（用于前端展示）"""
        return cls.collection.find_one({"_id": ObjectId(user_id)})